package com.nettyBasic.n7_byteBuf;

import com.nettyBasic.util.ByteBufLog;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;

import static io.netty.buffer.ByteBufUtil.appendPrettyHexDump;
import static io.netty.util.internal.StringUtil.NEWLINE;

/**
 * @author： pang-yun
 * @date： 2021-09-13 15:55
 * 功能目的 ：用于  byteBuf   检测 bytebuf 自行扩容的效果
 */

/*
* 在 idea 中 配置 -Dio.netty.allocator.type=unpooled  可以 使 butebuf 非池化
*
* */

public class BytebufDemo {
    public static void main(String[] args) {
        // 以默认方式进行创建
        ByteBuf buf = ByteBufAllocator.DEFAULT.buffer();
        //class io.netty.buffer.PooledUnsafeDirectByteBuf  pool  Direct 池化 + 直接内存

        // 输出 buf 的
        System.out.println(buf.getClass());
        log(buf);

        StringBuilder sb = new StringBuilder();

        for (int i=0;i<2;i++){
            sb.append("A");
        }
        // 将数据写入buf   发现buf 已经自行扩容
        buf.writeBytes(sb.toString().getBytes());
        ByteBufLog.bufLog(buf);

    }

    // 用于直观观察 bytebuf 的 工具类
    public static void log(ByteBuf buf){
        int length = buf.readableBytes();
        int rows= length/16 + (length % 15 ==0 ? 0 : 1) +4;
        StringBuilder builder = new StringBuilder(rows*80*2)
                .append("read index : ").append(buf.readerIndex())
                .append("\n")
                .append("write index: ").append(buf.writerIndex())
                .append("\n")
                .append("capacity:").append(buf.capacity())
                .append(NEWLINE);
        appendPrettyHexDump(builder,buf);
        System.out.println(builder.toString());
    }
}
